import babel from '@babel/core'  //
import presetEnv from '@babel/preset-env' // 预设。es6->es5的核心包
import react from '@babel/preset-react' // 支持jsx

import fs from 'node:fs' // 要读取test.js的文件内容

const code = fs.readFileSync('./test.js', 'utf8')
// const code = fs.readFileSync('./app.jsx', 'utf8')
console.log('原始code:', code)
const start = new Date().getTime(); // 或者使用 Date.now()

/**
 * 自定义babel插件
 * 作用：把箭头函数转成function。即：()=>{}  转成function
 */
const transformFunction = ({ types }) => {
  console.log('types:', types) // 包含了AST的所有方法
  return {
    name: 'transformFunction', // 名字
    // 生命周期
    visitor: {
      // 匹配：
      // 匹配箭头函数（ArrowFunctionExpression）：
      ArrowFunctionExpression: (path) => {
        console.log('path:', path.node)
        const node = path.node
        // 参数：async、params、body
        const arrowFunction = types.functionExpression(
          null, // 名称。null：匿名函数
          node.params, // 参数
          // node.body, // 箭头函数和普通函数的body不一样，所以要转一下。
          types.blockStatement([types.returnStatement(node.body)]),
          node.async
        )
        path.replaceWith(arrowFunction)
      }
    }
  }
}
const result = babel.transform(code, {
  // presets: ['@babel/preset-env'],
  // 预设：
  presets: [
    [
      presetEnv,
      // usage:按需引入;entry:手动引入，需要在test.js中自己引入;
      { useBuiltIns: 'usage', corejs: 3 } // 3:是指core-js的版本
    ],
    react
  ]
  // 不使用预设，而是使用自定义babel插件
  // plugins: [ transformFunction ]
})

console.log('转译后的code：', result.code)
const end = new Date().getTime(); // 或者使用 Date.now()
console.log(`Execution time: ${end - start} ms`);
